package com.donglan.pethome.user.interceptor;

import com.donglan.pethome.basic.util.RedisUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * @Author: zhangdonghui
 * @Date: 2022/1/20 15:49
 *
 * Ctrl + O 查看父类接口方法
 * 创建一个登录拦截器
 */
@Component
public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        // 获取token的值
        String token = request.getHeader("U-TOKEN");
        // 如果 token 为空，表示前端用户没有登录
        if(StringUtils.isEmpty(token)){
            // 提示前端用户，未登录，请重新登录
            wirteError(response,"noLogin");
            return false;
        }

        // 从redis中获取token对应的value信息：登录用户信息
        String userJsonString = RedisUtil.INSTANCE.get(token);
        // 如果根据token获取的对应的用户信息为空，表示redis中存储的用户信息过期了
        if (StringUtils.isEmpty(userJsonString)){
            // 提示前端用户，登录超时expire，请重新登录
            wirteError(response,"expireUser");
            return false;
        }

        // 如果登录用户没有过期，而且已经登陆过了
        // 那么需要给登录用户重新刷新30分钟的交互时间
        // 重新刷新redis有效期
        RedisUtil.INSTANCE.set(token,userJsonString,60*30);

        return true;
    }

    private void wirteError(HttpServletResponse response,String message){
        PrintWriter writer = null;
        try {
            response.setContentType("text/json;charset=utf-8");
            writer = response.getWriter();
            // 标准的json格式字符串，需要使用双引号，使用\进行转义
            writer.write("{\"success\":false,\"msg\":\""+message+"\"}");

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (writer != null){
                writer.close();
            }
        }

    }

}
